/**
 * 日期时间辅助函数
 * @module datetime/helpers
 */

/**
 * 判断指定年份是否是闰年
 * @param year - 要判断的年份
 * @returns {boolean} 如果是闰年返回true，否则返回false
 * @example
 * import { isLeapYear } from './helpers';
 * 
 * const result1 = isLeapYear(2024); // true
 * const result2 = isLeapYear(2023); // false
 * const result3 = isLeapYear(2000); // true
 * const result4 = isLeapYear(1900); // false
 */
export function isLeapYear(year: number): boolean {
  // 闰年规则：能被4整除但不能被100整除，或者能被400整除
  return (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0);
}

/**
 * 获取指定月份的天数
 * @param month - 月份（1-12）
 * @param year - 可选的年份，当月份为2时必须提供
 * @returns {number} 指定月份的天数
 * @throws {Error} 当月份为2但未提供年份时抛出错误
 * @example
 * import { getDaysInMonth } from './helpers';
 * 
 * // 非2月份不需要指定年份
 * const daysInMarch = getDaysInMonth(3); // 31
 * const daysInApril = getDaysInMonth(4); // 30
 * 
 * // 2月份必须指定年份
 * const daysInFebruary2024 = getDaysInMonth(2, 2024); // 29（闰年）
 * const daysInFebruary2023 = getDaysInMonth(2, 2023); // 28（非闰年）
 */
export function getDaysInMonth(month: number, year?: number): number {
  // 验证月份范围
  if (month < 1 || month > 12) {
    throw new Error('Month must be between 1 and 12');
  }
  
  // 对于2月份，必须提供年份参数
  if (month === 2 && year === undefined) {
    throw new Error('Year must be specified for February');
  }
  
  // 各月份的天数映射（2月份先使用默认值28）
  const daysInMonthMap: Record<number, number> = {
    1: 31,
    2: 28,
    3: 31,
    4: 30,
    5: 31,
    6: 30,
    7: 31,
    8: 31,
    9: 30,
    10: 31,
    11: 30,
    12: 31
  };
  
  // 如果是2月份且提供了年份，根据是否是闰年返回29或28
  if (month === 2 && year !== undefined) {
    return isLeapYear(year) ? 29 : 28;
  }
  
  // 返回其他月份的天数
  return daysInMonthMap[month];
}